from flask import jsonify

from address_normalizer.app.common.params import RequestBase
from address_normalizer.app.common.response import InvalidAddressError, AddressParameterError, RF, EF
from address_normalizer.app.config import logger, TOKENIZE_MODEL
from address_normalizer.app.models.address_model import AddressModel
from address_normalizer.app.models.corrector import CorrectAddress
from address_normalizer.app.models.invalid_address import InvalidAddress
from address_normalizer.app.schemas.address_schemas import InvalidAddressSchemas, AddressSchemas


class NormalizeAddress(RequestBase):

    def post(self):
        """
        正确地址的分词与验证：
        切分到省级： 部分正确的地址需要准确切分到省级。
        地址验证与补全： 验证地址正确性，并在必要时补全信息。

        错误地址的处理：
        提示信息返回： 对错误地址提供明确的提示信息。
        区分错误地址与部分正确地址： 需要有效区分错误地址和部分正确地址的机制。
        数据维护：

        地址数据更新： 提供的地址数据可能变动，需要定期维护。
        代码逻辑：
        先进行分词，对每个词性进行判断，如果词性为地名，则进行地址验证与补全。
        如果不存在地名，则返回错误信息。
        :return:
        """
        original_address = self.get_param('Address')
        address = original_address
        # 无效地址判断
        address = InvalidAddress().is_valid_address(original_address)
        if InvalidAddressError.Message == address or AddressParameterError.Message == address:
            logger.warning(f"无效地址：{original_address}")
            invalid = InvalidAddressSchemas()
            invalid.invalid_address = original_address
            return EF.error_address(Msg=address, StandardAddress=invalid.dict())
            # 地址纠正与补全
        correct = CorrectAddress()
        refined_address = correct.correct_location(address)
        logger.info(f"地址纠错并补全省市区: {refined_address}")

        # 地址模型预测
        model = AddressModel(mode=TOKENIZE_MODEL)
        predicted_result = model.predict(refined_address)

        # 提取其他地址信息并更新预测结果
        other_address = correct.extract_other_address(address, result=predicted_result)
        predicted_result.update({'other_address': other_address})

        # 处理标准化地址并更新预测结果
        standard_address = model.standard_address_process(predicted_result)
        predicted_result.update({'standard_address': standard_address})

        logger.info(f"模型预测结果返回内容: {predicted_result}")

        # 将结果转换为模式对象并返回成功响应
        address_schemas = AddressSchemas(**predicted_result)
        return RF.success_address(StandardAddress=address_schemas.dict())

    def get(self):
        return self.post()
